SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE [dbo].[LIQAguinaldo]
@Agente INT,
@Servicio INT,
@Plaza INT,
@Resultado DECIMAL OUTPUT,
@idLiquidacion INT,
@DiasALiquidar INT, 
@DiasDelPeriodo INT,
@Desde DATETIME,
@Hasta DATETIME
 AS 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- REGISTRO DE ACTUALIZACIONES
-- 17/11/2005 - Se agregaron parametros @Desde y @Hasta para manejo de Fechas en Titulares y Suplentes
-- 05/12/2005 - Se tienen en cuenta las liquidaciones DEFINITIVAS para evaluar el MAXIMO REMUNERATIVO.
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- En realidad se liquida MEDIO AGUINALDO.

-- <PROCEDIMIENTO>
-- Se obtiene EL MAXIMO REMUNERATIVO CON APORTE DE LOS ULTIMOS 6 MESES.
-- Se le suma el PRESENTISMO PARA ESE MES (el mismo que tiene el MAXIMO REMUNERATIVO) y a esta suma se la divide por 2.
-- Se proporciona a los días trabajados en el período: DIAS TRABAJADOS EN ESE SERVICIO EN LOS 6 MESES * (MAXIMO REMUNERATIVO + PRESENTISMO) / 183 (Dias)
--</PROCEDIMIENTO>

-- <AVERIGUAR>
-- 1. El procedimiento descripto es el correcto?
-- 2. Qué hacemos con los Suplentes Comunes respecto a las Fechas? Se van a liquidar en Diciembre o Enero? (PARTICULARMENTE ME INCLINO A ENERO)
-- 3. Por qué son 183 Días?
-- </AVERIGUAR>


SET NOCOUNT ON

SET DATEFORMAT DMY

DECLARE @MaximoHaber DECIMAL(18,4), @DescuentoBancario DECIMAL(18,4), @SAC DECIMAL(18,4)
DECLARE @Remunerativo DECIMAL(18,4), @Presentismo DECIMAL(18,4)
DECLARE @TotalRemunerativo DECIMAL(18,4)
DECLARE @Afiliacion INT, @horas INT, @regimensalarial  INT, @organizacion INT,@situacionrevista INT
DECLARE @DescAporte DECIMAL(18,4)
DECLARE @NroError INT
DECLARE @SubOrganizacion INT
DECLARE @Cabecera INT
DECLARE @TotalRemunerativoMesActual  DECIMAL(18,4)

DECLARE @FechaAlta DATETIME, @FechaBaja DATETIME
DECLARE @TotalDiasSinGoce INT
DECLARE @TotalDiasTrabajados INT
DECLARE @SueldoBasico DECIMAL(18,4)
DECLARE @CabeceraDeLiquidacion INT 
DECLARE @FechaDesde DATETIME, @FechaHasta DATETIME
DECLARE @CantidadDeAguinaldos DECIMAL(18,2)
DECLARE @MesesDeAguinaldo INT
DECLARE @DiasDeAguinaldo INT 
DECLARE @AuxAguinaldoDesde VARCHAR(10), @AguinaldoDesde DATETIME, @AguinaldoHasta DATETIME
DECLARE @FechaHastaRealAguinaldo DATETIME

SELECT @SueldoBasico = MontoHaberes FROM tb_RegistroDeLiquidaciones WHERE Concepto = 4 And Servicio = @Servicio And Liquidacion = @idLiquidacion
SELECT @Presentismo = 0, @Remunerativo = 0

--SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = 'CantidadDeAguinaldosAPagar'
--SELECT @MesesDeAguinaldo = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'MesesDeAguinaldo'

SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('CantidadDeAguinaldosAPagar', @Hasta))
SELECT @MesesDeAguinaldo = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('MesesDeAguinaldo', @Hasta))

SELECT @Cabecera =  IdCabeceraLiquidacion FROM tb_Liquidaciones WHERE IdLiquidacion = @IdLiquidacion
SELECT @FechaHastaRealAguinaldo = Hasta FROM tb_CabeceraDeLiquidacion WHERE IdCabeceraDeLiquidacion = @Cabecera

SELECT @AguinaldoHasta = @Hasta

-- Para armar la FECHA DESDE EL AGUINALDO
IF MONTH(@AguinaldoHasta) > @MesesDeAguinaldo
	SELECT @AuxAguinaldoDesde = '01/07/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))
ELSE
	SELECT @AuxAguinaldoDesde = '01/01/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))

SELECT @AguinaldoDesde = CONVERT(DATETIME, @AuxAguinaldoDesde)

SELECT @TotalDiasSinGoce=0, @TotalDiasTrabajados = 0

SELECT @DiasDeAguinaldo = DATEDIFF(DAY, @AguinaldoDesde, @FechaHastaRealAguinaldo) + 1

-- Se obtiene el Máximo Remunerativo con Aporte y el presentismo para ese mes.
--Esta tomando máximo con el presentismo incluído!!

SELECT @Remunerativo = MAX(R.MontoHaberes+ISNULL(R2.MontoHaberes,0.0)) 
	FROM tb_RegistroDeLiquidaciones R, tb_RegistroDeLiquidaciones R2, tb_Liquidaciones L, tb_RegistroDeLiquidaciones R3 
	WHERE idLiquidacion = R.Liquidacion
		And R.Concepto = 16 And L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta
		And R.Agente = @Agente And R.Servicio = @Servicio And R2.Servicio = R.Servicio
		And R.Liquidacion = R2.Liquidacion And R2.Concepto = 9 
		AND L.Tipo = 4 --Agregado   05/12/2005
		AND R3.Liquidacion = R.Liquidacion AND R3.Servicio = R.Servicio AND R3.Concepto = 29 AND R3.MontoHaberes < 32
		
If @Remunerativo Is Null 
	SELECT @Remunerativo = 0

SELECT @TotalRemunerativoMesActual = SUM(MontoHaberes)  FROM tb_RegistroDeLiquidaciones, tb_ConceptosDeLiquidacion 
	 WHERE Servicio = @Servicio and liquidacion = @idLiquidacion and concepto = idConceptoLiquidacion and ((tipo = 1 or tipo = 2) OR (Concepto=9))

IF @TotalRemunerativoMesActual > @Remunerativo 
	SELECT @Remunerativo = @TotalRemunerativoMesActual

--If @Remunerativo Is Null Or @Remunerativo = 0
--	SELECT @Remunerativo = MAX(R.MontoHaberes)
--	FROM tb_RegistroDeLiquidaciones R,  tb_Liquidaciones L, tb_RegistroDeLiquidaciones R3 
--	WHERE idLiquidacion = R.Liquidacion
--	And R.Concepto = 16 And L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta
--	And R.Agente = @Agente And R.Servicio = @Servicio
--	AND L.Tipo = 4 --Agregado   05/12/2005
--	AND R3.Liquidacion = R.Liquidacion AND R3.Servicio = R.Servicio AND R3.Concepto = 29 AND R3.MontoHaberes < 32

SELECT @MaximoHaber = @Remunerativo * @CantidadDeAguinaldos

SELECT @TotalDiasTrabajados = DATEDIFF(DAY, FechaAlta, ISNULL(FechaBaja,@AguinaldoHasta))+1 FROM tb_ServiciosAgentes WHERE idServicioAgente = @Servicio

DECLARE DiasSinGoce CURSOR FOR SELECT FechaAlta, FechaBaja FROM tb_SubServiciosAgentes
		 WHERE ServicioAgente = @Servicio And SituacionLaboral = 4 And ((FechaBaja Is Null) or (FechaBaja >= @AguinaldoDesde))

OPEN DiasSinGoce
FETCH NEXT FROM DiasSinGoce INTO @FechaAlta, @FechaBaja

WHILE @@FETCH_STATUS = 0
BEGIN
	IF @AguinaldoHasta < @FechaBaja Or @FechaBaja Is Null
		SELECT @FechaBaja = @AguinaldoHasta
	IF @FechaAlta < @AguinaldoDesde
		SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @AguinaldoDesde,@FechaBaja)+1
	ELSE
		SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @FechaAlta,@FechaBaja)+1	
	FETCH NEXT FROM DiasSinGoce INTO @FechaAlta, @FechaBaja
END

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Entiendo que esto se debe hacer con @AguinaldoDesde y @AguinaldoHasta tambien comente la declaracion y carga de @FDesde y @FHasta
--WHILE @@FETCH_STATUS = 0
--BEGIN
--	IF @FHasta < @FechaBaja Or @FechaBaja Is Null
--		SELECT @FechaBaja = @Fhasta
--	IF @FechaAlta < @FDesde
--		SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @FDesde,@FechaBaja)+1
--	ELSE
--		SELECT @TotalDiasSinGoce = @TotalDiasSinGoce + DATEDIFF(DAY, @FechaAlta,@FechaBaja)+1	
--	FETCH NEXT FROM DiasSinGoce INTO @FechaAlta, @FechaBaja
--END
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CLOSE DiasSinGoce
DEALLOCATE DiasSinGoce

If @TotalDiasTrabajados > @DiasDeAguinaldo
	SELECT @TotalDiasTrabajados = @DiasDeAguinaldo

If @TotalDiasSinGoce > @DiasDeAguinaldo
	SELECT @TotalDiasSinGoce = @DiasDeAguinaldo

SELECT @TotalDiasTrabajados = @TotalDiasTrabajados - @TotalDiasSinGoce

SELECT @SAC = (@TotalDiasTrabajados * @MaximoHaber) / @DiasDeAguinaldo

SELECT @Afiliacion = idAfiliacion	 FROM tb_Afiliaciones WHERE idAgente = @Agente
SELECT @horas= horas, @regimensalarial = regimensalarial, @SubOrganizacion = SubOrganizacion 
	FROM tb_Plazas WHERE idPlaza = @Plaza
SELECT @Organizacion = ubicacionOrig, @SituacionRevista = SituacionRevista 
	FROM tb_ServiciosAgentes WHERE idservicioAgente =  @Servicio

IF (SELECT OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE
idSubOrganizacion = @SubOrganizacion) Is Not Null
	SELECT @Organizacion = OrganizacionLiquidadora FROM tb_SubOrganizaciones WHERE
idSubOrganizacion = @SubOrganizacion

If  @SAC > 0 
  INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
  VALUES (null, @Afiliacion, @Agente, null, 1, null, 32, null, null, null, null, null, null, @horas, 0, @idLiquidacion, 0, @SAC, @Organizacion, null, @Servicio, @SituacionRevista, @diasALiquidar, @SubOrganizacion)

SELECT @NroError = @@error

IF @NroError <> 0
  BEGIN
	SELECT @CabeceraDeLiquidacion = IdCabeceraLiquidacion FROM tb_Liquidaciones WHERE IdLiquidacion = @IdLiquidacion

 	INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) 
	 VALUES(@Agente, 32, convert(varchar,@NroError), getdate(), @idLiquidacion,@Organizacion, @Servicio, @CabeceraDeLiquidacion, @NroError)
  END
GO
